package cn.manyufun.myf.common.commonutils;

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

/**
 * Created by Xiao on 2018-02-13.
 */

public class InputMethodKeybordUtils {

    /**
     * 打开或隐藏软键盘
     *
     * @param context
     */
    public static void hideOrShowKeyboard(Context context) {
        InputMethodManager inputMethodManager =
                (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInput(
                InputMethodManager.SHOW_IMPLICIT,
                InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

    /**
     * 显示软键盘
     *
     * @param context
     */
    public static void forceShowKeyboard(Context context) {
        if (!getInputStatus(context)) {//如果是关闭状态才调用
            hideOrShowKeyboard(context);
        }
        setmInputState(InputState.True);//设置当前输入法状态为打开
    }

    /**
     * 强制隐藏软键盘
     *
     * @param context
     * @param view
     */
    public static void forceHideKeyboard(Context context, View view) {
        //仅针对传进来的的context有效，对于控件自动唤起无效
        if (getInputStatus(context)) {//如果是打开状态才调用
            hideOrShowKeyboard(context);
        }
        //强制关闭，仅仅对控件唤起有效。
        InputMethodManager imm =
                (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(
                view.getWindowToken(), InputMethodManager.SHOW_FORCED);
        setmInputState(InputState.False);//设置当前输入法状态为关闭
    }

    /**
     * 获取输入法状态
     *
     * @param context
     * @return
     */
    public static boolean getInputStatus(Context context) {
        //初始化输入法,当前根据当前APP输入法状态
        if (mInputState == InputState.Null) {
            InputMethodManager imm =
                    (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            mInputState = imm.isActive() ? InputState.True : InputState.False;
        }
        return mInputState == InputState.True;     // 若返回true，则表示输入法打开
    }

    //输入法状态枚举类
    public enum InputState {
        Null, True, False;
    }

    private static InputState mInputState = InputState.Null;

    public static void setmInputState(InputState inputState) {
        mInputState = inputState;
    }
}

